/**
 * @ProjectName: go-learn-demo
 * @PackageName: _2_relation
 * @Description:
 * @Author: hy.bai
 * @Date: 2025-08-05 18:10
 */
package m2mtable

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"time"
)

var currentTimeStr = time.Now().Format(time.DateTime)

// 实现多对多的功能:创建两个关联的结构体
// 在Mysql中，实现多对多功能是创建一个中间表。
// 定义User结构体

type User struct {
	gorm.Model
	Username  string
	Languages []*Language `gorm:"many2many:t_user_languages"` // 定义多对多的关系(生成中间表),并指定中间表的表名。
	// foreignKey:UserRefer 表示的含义是修改外键字段是UserRefer，默认是Id。即:使用UserRefer作为外键。
}

// 定义表表名
func (*User) TableName() string {
	return "t_user"
}

// 定义Language结构体
type Language struct {
	gorm.Model
	Name string
	User []*User `gorm:"many2many:t_user_languages"` // 定义多对多的关系(生成中间表),并指定中间表的表名。
}

// 定义表表名
func (*Language) TableName() string {
	return "t_language"
}

// 创建多对多的表结构
func TestCreateTable() {
	// 1.连接数据库
	dns := "root:root@tcp(127.0.0.1:3308)/test?charset=utf8mb4&parseTime=True&loc=Local"
	// 定义全局配置
	gConfig := &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	}
	db, err := gorm.Open(mysql.Open(dns), gConfig)
	if err != nil {
		panic(fmt.Sprintf("连接数据库失败,失败原因是:%s\n", err.Error()))
	} else {
		fmt.Printf("连接的数据库是:%s", db.Name()) // mysql:表示数据库连接成功
	}

	// 2.判断数据库表是否存在，如果不存在，则创建
	user := &User{}
	language := &Language{}
	if !db.Migrator().HasTable(user) {
		db.AutoMigrate(user)
	}
	if !db.Migrator().HasTable(language) {
		db.AutoMigrate(language)
	}

	fmt.Println("数据库初始化执行完毕~~~")
}
